Dart প্রোগ্রামিং ভাষার বেসিক সম্পর্কে নিচে বিস্তারিতভাবে আলোচনা করা হলো। Dart হলো Flutter এর ডিফল্ট প্রোগ্রামিং ভাষা, যা Google দ্বারা তৈরি। এটি একটি Object-Oriented, ক্লায়েন্ট-সাইড ভাষা, যা অ্যাপ্লিকেশন তৈরিতে ব্যবহৃত হয়। Dart শেখা সহজ এবং এটি JavaScript এর বিকল্প হিসেবে অনেক ক্ষেত্রে ব্যবহৃত হয়।
Dart প্রোগ্রামিং ভাষার বেসিক বিষয়গুলো:
১. প্রথম প্রোগ্রাম: Hello World
- Dart প্রোগ্রামে প্রথম উদাহরণ:
void main() {
print('Hello, World!');
}void main()হলো Dart প্রোগ্রামের এন্ট্রি পয়েন্ট।print()ফাংশন ব্যবহার করে টার্মিনালে কোনো মেসেজ প্রিন্ট করা হয়।
২. ডেটা টাইপ এবং ভেরিয়েবল:
Dart এ কিছু সাধারণ ডেটা টাইপ:
- int: পূর্ণসংখ্যার জন্য (যেমন:
int age = 25;) - double: দশমিক সংখ্যা বা ফ্লোটিং পয়েন্টের জন্য (যেমন:
double price = 19.99;) - String: টেক্সট বা স্ট্রিং ডেটা টাইপ (যেমন:
String name = 'John';) - bool: বুলিয়ান টাইপ, যা
trueবাfalseধারণ করে (যেমন:bool isAlive = true;) - dynamic: Dart এ
dynamicটাইপ কোনো ভেরিয়েবলের ডেটা টাইপ পরিবর্তনশীল হতে পারে (যেমন:dynamic variable = 'Hello';তারপরvariable = 42;)
৩. কনস্ট্যান্ট এবং ফাইনাল ভেরিয়েবল:
- const:
constদিয়ে ডিক্লেয়ার করা ভেরিয়েবল রানটাইমের আগে ইনিশিয়ালাইজ হয় এবং এটি কখনো পরিবর্তন হয় না।
const double pi = 3.1416;- final:
finalদিয়ে ডিক্লেয়ার করা ভেরিয়েবল ইনিশিয়ালাইজ হওয়ার পর পরিবর্তন হয় না, তবে এটি রানটাইমে ইনিশিয়ালাইজ হতে পারে।
final DateTime now = DateTime.now();৪. ফাংশন:
- Dart এ ফাংশন কিভাবে ডিফাইন করা হয়:
int addNumbers(int a, int b) {
return a + b;
}
void main() {
int sum = addNumbers(5, 10);
print(sum); // Output: 15
}- Dart এ ফাংশন রিটার্ন টাইপ এবং প্যারামিটার ডেটা টাইপ ডিফাইন করা হয়।
৫. ক্লাস এবং অবজেক্ট:
- Dart একটি Object-Oriented ভাষা, তাই এতে ক্লাস এবং অবজেক্টের ধারণা রয়েছে।
class Person {
String name;
int age;
Person(this.name, this.age);
void sayHello() {
print('Hello, my name is $name and I am $age years old.');
}
}
void main() {
Person person = Person('Alice', 30);
person.sayHello();
}- Dart এ ক্লাসের মধ্যে ভেরিয়েবল (properties) এবং মেথড (methods) ডিফাইন করা যায়।
৬. লুপ এবং কন্ডিশনাল স্টেটমেন্ট:
- if-else:
int number = 10;
if (number > 5) {
print('Number is greater than 5');
} else {
print('Number is 5 or less');
}- for লুপ:
for (int i = 0; i < 5; i++) {
print('Iteration: $i');
}- while লুপ:
int count = 0;
while (count < 5) {
print('Count: $count');
count++;
}৭. লিস্ট এবং ম্যাপ:
- List: একটি সংগ্রহ যা একাধিক আইটেম ধরে রাখতে পারে।
List<String> fruits = ['Apple', 'Banana', 'Cherry'];
print(fruits[0]); // Output: Apple- Map: কী-ভ্যালু পেয়ার হিসেবে ডেটা সংরক্ষণ করা হয়।
Map<String, int> scores = {
'Alice': 90,
'Bob': 85,
'Charlie': 95,
};
print(scores['Alice']); // Output: 90৮. নাল সেফটি (Null Safety):
- Dart এ নাল সেফটি যুক্ত করা হয়েছে, যা ভেরিয়েবলকে নাল ভ্যালু ধারন থেকে রক্ষা করে।
- নন-নালেবল ভেরিয়েবল ডিফাইন করতে:
String name = 'John'; // এটি কখনো null হবে না- নালেবল ভেরিয়েবল ডিফাইন করতে:
String? nullableName;
nullableName = null; // এটি null হতে পারে৯. এনার্জম:
- Enum ব্যবহার করে নির্দিষ্ট কিছু অপশন বা মান সংজ্ঞায়িত করা যায়।
enum Weather { sunny, rainy, cloudy }
void main() {
Weather today = Weather.sunny;
switch (today) {
case Weather.sunny:
print('It\'s a sunny day!');
break;
case Weather.rainy:
print('It\'s raining!');
break;
case Weather.cloudy:
print('It\'s cloudy today!');
break;
}
}Dart এর এই বেসিক বিষয়গুলো আপনাকে Dart প্রোগ্রামিং ভাষা বুঝতে এবং Flutter ডেভেলপমেন্ট শুরু করতে সহায়তা করবে।
Dart প্রোগ্রামিং ভাষা হলো গুগলের তৈরি একটি সাধারণ উদ্দেশ্যে ব্যবহারযোগ্য প্রোগ্রামিং ভাষা, যা মূলত Flutter এর জন্য ব্যবহৃত হয়। এটি জাভাস্ক্রিপ্টের বিকল্প হিসেবে এবং বিশেষ করে মোবাইল, ডেস্কটপ, ওয়েব, এবং সার্ভার সাইড অ্যাপ্লিকেশন ডেভেলপ করার জন্য তৈরি করা হয়েছে। নিচে Dart প্রোগ্রামিং ভাষার মৌলিক ধারণা ও কিছু গুরুত্বপূর্ণ বৈশিষ্ট্য দেওয়া হলো:
Dart প্রোগ্রামিং ভাষার মৌলিক ধারণা
সাধারণ ব্যবহার: Dart হলো একটি সাধারণ উদ্দেশ্যে ব্যবহৃত ভাষা, যা ওয়েব অ্যাপ্লিকেশন, মোবাইল অ্যাপ্লিকেশন (Flutter), এবং সার্ভার-সাইড অ্যাপ্লিকেশন ডেভেলপ করতে ব্যবহৃত হয়। এটি একটি ফাস্ট, প্রোডাক্টিভ, এবং প্রোডাকশন রেডি ভাষা।
সিমেন্ট্যাক্স এবং স্টাইল:
- Dart এর সিমেন্ট্যাক্স C, Java, এবং JavaScript এর মতো। ফলে এই ভাষাগুলোর অভিজ্ঞ ডেভেলপাররা সহজেই Dart শিখতে পারেন।
- এটি একটি স্ট্যাটিক টাইপড ভাষা হলেও টাইপ ইনফারেন্স ব্যবহার করে, যার ফলে কোড লেখার সময় টাইপ উল্লেখ করা বাধ্যতামূলক নয়।
কম্পাইলেশন:
- Dart ভাষা Ahead-of-Time (AOT) এবং Just-in-Time (JIT) কম্পাইলেশন সাপোর্ট করে।
- AOT কম্পাইলেশন মোবাইল এবং ডেক্সটপ অ্যাপ্লিকেশনের জন্য ব্যবহৃত হয়, যা অ্যাপের পারফরম্যান্স বাড়ায়।
- JIT কম্পাইলেশন ডেভেলপমেন্টের সময় দ্রুত পরিবর্তন পরীক্ষা করার জন্য সহায়ক।
Dart এর মৌলিক বৈশিষ্ট্যসমূহ
অবজেক্ট-ওরিয়েন্টেড:
- Dart একটি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ভাষা। এখানে সবকিছুই অবজেক্ট, এবং প্রতিটি অবজেক্ট একটি ক্লাস থেকে তৈরি হয়।
স্ট্যাটিক টাইপিং:
- Dart স্ট্যাটিক টাইপড, যার মানে প্রতিটি ভেরিয়েবল বা অবজেক্টের টাইপ ডিক্লেয়ার করা হয়। কিন্তু Dart এর টাইপ ইনফারেন্স থাকার কারণে টাইপ সরাসরি উল্লেখ করা বাধ্যতামূলক নয়।
- উদাহরণ:
int age = 25; // Explicit type declaration
var name = 'Alice'; // Type inference
ফাংশনাল এবং অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং:
- Dart ফাংশনাল প্রোগ্রামিং সাপোর্ট করে এবং Lambda expressions বা Arrow functions ব্যবহার করে ফাংশন লিখতে দেয়।
- Dart অ্যাসিঙ্ক্রোনাস প্রোগ্রামিংয়ের জন্য
asyncএবংawaitকীওয়ার্ড ব্যবহার করে, যা Asynchronous এবং Future API সাপোর্ট করে। এটি কোডকে সহজভাবে অ্যাসিঙ্ক্রোনাস অপারেশন পরিচালনা করতে সাহায্য করে।
ক্লোজার এবং লেক্সিকাল স্কোপিং:
- Dart ক্লোজার এবং লেক্সিকাল স্কোপিং সাপোর্ট করে, যা ফাংশনগুলোকে এক্সেস করতে এবং মেমরি অপটিমাইজ করতে সাহায্য করে।
এক্সটেনশন মেথডস:
- Dart এক্সটেনশন মেথড সাপোর্ট করে, যা বিদ্যমান ক্লাসে নতুন মেথড যোগ করার সুযোগ দেয়, এমনকি ক্লাসের সোর্স কোড পরিবর্তন না করেও।
Dart এর মৌলিক গঠন
১. ভেরিয়েবল ডিক্লেয়ারেশন
Dart এ ভেরিয়েবল ডিক্লেয়ার করতে var, final, বা const ব্যবহার করা হয়:
var name = 'Alice'; // Type inference
final int age = 25; // Immutable variable
const double pi = 3.14159; // Compile-time constant
২. ফাংশন ডিক্লেয়ারেশন
Dart এ ফাংশন খুব সহজেই ডিক্লেয়ার করা যায়:
int add(int a, int b) {
return a + b;
}
Lambda expression ব্যবহার করে:
int add(int a, int b) => a + b;
৩. ক্লাস এবং অবজেক্ট
Dart হলো একটি অবজেক্ট-ওরিয়েন্টেড ভাষা, এবং ক্লাস তৈরি করা খুবই সহজ:
class Person {
String name;
int age;
Person(this.name, this.age);
void introduce() {
print('Hi, my name is $name and I am $age years old.');
}
}
void main() {
Person p = Person('Alice', 25);
p.introduce();
}
৪. কন্ডিশনাল এবং লুপ
Dart এ if-else, for, while, এবং do-while লুপ সমর্থিত:
void main() {
int number = 10;
// if-else
if (number > 0) {
print('Positive');
} else {
print('Negative');
}
// for loop
for (int i = 0; i < 5; i++) {
print(i);
}
}
৫. অ্যাসিঙ্ক্রোনাস প্রোগ্রামিং
Dart এর async এবং await কীওয়ার্ড ব্যবহার করে অ্যাসিঙ্ক্রোনাস অপারেশন হ্যান্ডেল করা যায়:
Future<void> fetchData() async {
await Future.delayed(Duration(seconds: 2));
print('Data fetched');
}
void main() {
fetchData();
print('Fetching data...');
}
Dart কেন শিখবেন?
Flutter এর জন্য অত্যন্ত গুরুত্বপূর্ণ: যদি আপনি Flutter ডেভেলপমেন্ট শিখতে চান, তবে Dart ভাষা শিখা অত্যন্ত গুরুত্বপূর্ণ। এটি Flutter এর জন্য মূল প্রোগ্রামিং ভাষা।
সহজ এবং দ্রুত: Dart এর সিমেন্ট্যাক্স অন্যান্য সাধারণ ভাষার মতো হওয়ায় এটি শিখতে সহজ। এছাড়াও, এটি দ্রুত কম্পাইল করা যায় এবং পারফরম্যান্সে উন্নত।
স্ট্যাটিক এবং ডাইনামিক টাইপিং সাপোর্ট: এটি স্ট্যাটিক টাইপড হলেও ডাইনামিক টাইপিংয়ের সুবিধা দেয়, যার ফলে ডেভেলপাররা সহজেই টাইপ ম্যানেজ করতে পারে।
বড় কমিউনিটি এবং গুগলের সাপোর্ট: Dart একটি ওপেন সোর্স প্রোজেক্ট এবং গুগল এটি নিয়মিত আপডেট এবং রক্ষণাবেক্ষণ করে। এটি ডেভেলপারদের জন্য একটি শক্তিশালী এবং প্রোডাক্টিভ টুলসেট প্রদান করে।
Dart প্রোগ্রামিং ভাষায় Variables, Data Types, এবং Operators সম্পর্কে বিস্তারিত আলোচনা করা হলো। Dart একটি Object-Oriented ভাষা এবং এতে ডেটা স্টোর করা, পরিচালনা করা এবং প্রক্রিয়া করার জন্য ভেরিয়েবল, বিভিন্ন ডেটা টাইপ, এবং অপারেটর ব্যবহার করা হয়।
১. Variables (ভেরিয়েবল):
ভেরিয়েবল হলো প্রোগ্রামে ডেটা সংরক্ষণ করার জায়গা। Dart এ ভেরিয়েবল ডিক্লেয়ার করতে var, final, const, বা নির্দিষ্ট ডেটা টাইপ (যেমন int, String) ব্যবহার করা হয়।
ভেরিয়েবল ডিক্লেয়ারেশন:
void main() {
var name = 'Alice'; // String টাইপ ভেরিয়েবল
int age = 25; // পূর্ণসংখ্যা টাইপ ভেরিয়েবল
double price = 19.99; // দশমিক সংখ্যা টাইপ ভেরিয়েবল
bool isActive = true; // বুলিয়ান টাইপ ভেরিয়েবল
}
ফাইনাল এবং কনস্ট্যান্ট ভেরিয়েবল:
- final: ভেরিয়েবল একবার ইনিশিয়ালাইজ হলে এর মান পরিবর্তন করা যায় না। এটি রানটাইমে ইনিশিয়ালাইজ হয়।
- const: কনস্ট্যান্ট ভেরিয়েবল রানটাইমের আগে ইনিশিয়ালাইজ হয় এবং এটি কখনো পরিবর্তন হয় না।
final String cityName = 'New York';
const double pi = 3.1416;
২. Data Types (ডেটা টাইপস):
Dart এ বিভিন্ন প্রকারের ডেটা টাইপ আছে যা ভেরিয়েবলের ধরন নির্ধারণ করে। Dart একটি statically-typed ভাষা, অর্থাৎ ভেরিয়েবলের ডেটা টাইপ ইনিশিয়ালাইজেশনের সময় নির্ধারণ করা হয়।
Dart এর প্রধান ডেটা টাইপগুলো:
- int: পূর্ণসংখ্যা সংরক্ষণ করতে ব্যবহৃত হয়।
int age = 30;
- double: দশমিক সংখ্যা বা ফ্লোটিং পয়েন্ট সংখ্যা সংরক্ষণ করতে ব্যবহৃত হয়।
double price = 99.99;
- String: টেক্সট বা স্ট্রিং ডেটা সংরক্ষণ করতে ব্যবহৃত হয়।
String name = 'Alice';
- bool: বুলিয়ান টাইপ, যা
trueঅথবাfalseধারণ করে।
bool isAvailable = true;
- List: একটি সংগ্রহ, যা একাধিক আইটেম সংরক্ষণ করতে ব্যবহৃত হয়। এটি একটি অ্যারে হিসেবে কাজ করে।
List<String> fruits = ['Apple', 'Banana', 'Cherry'];
- Map: কী-ভ্যালু পেয়ার হিসেবে ডেটা সংরক্ষণ করতে ব্যবহৃত হয়।
Map<String, int> scores = {
'Alice': 90,
'Bob': 85,
'Charlie': 95,
};
- dynamic: যখন ভেরিয়েবলের ডেটা টাইপ পরিবর্তনশীল হতে পারে, তখন
dynamicটাইপ ব্যবহার করা হয়।
dynamic variable = 'Hello';
variable = 42; // এটি সাপোর্ট করবে
৩. Operators (অপারেটরস):
Dart এ বিভিন্ন ধরনের অপারেটর আছে যা ভেরিয়েবলের মান পরিবর্তন, তুলনা করা, বা অন্য কোনো গণনা সম্পাদন করতে ব্যবহৃত হয়।
প্রধান অপারেটরগুলো:
| অপারেটর টাইপ | উদাহরণ | ব্যাখ্যা |
|---|---|---|
| Arithmetic Operators | +, -, *, /, % | গাণিতিক কাজ (যোগ, বিয়োগ, গুণ, ভাগ, ভাগশেষ) |
| Relational Operators | ==, !=, >, <, >=, <= | তুলনা করা (সমান, অসমান, বড়, ছোট) |
| Logical Operators | &&, ` | |
| Assignment Operators | =, +=, -=, *=, /= | মান অ্যাসাইন করা এবং পরিবর্তন করা |
| Conditional Operator | condition ? expr1 : expr2 | শর্ত অনুসারে একটি মান নির্ধারণ করা |
| Type Test Operators | is, is! | টাইপ চেক করা (যেমনঃ is int) |
উদাহরণ: Arithmetic Operators
void main() {
int a = 10;
int b = 5;
print(a + b); // Output: 15
print(a - b); // Output: 5
print(a * b); // Output: 50
print(a / b); // Output: 2.0
print(a % b); // Output: 0 (remainder of the division)
}
উদাহরণ: Relational Operators
void main() {
int x = 10;
int y = 5;
print(x > y); // Output: true
print(x < y); // Output: false
print(x == y); // Output: false
print(x != y); // Output: true
}
উদাহরণ: Logical Operators
void main() {
bool a = true;
bool b = false;
print(a && b); // Output: false (AND operation)
print(a || b); // Output: true (OR operation)
print(!a); // Output: false (NOT operation)
}
উদাহরণ: Assignment Operators
void main() {
int num = 10;
num += 5; // num = num + 5;
print(num); // Output: 15
num *= 2; // num = num * 2;
print(num); // Output: 30
}
উদাহরণ: Conditional (Ternary) Operator
void main() {
int age = 18;
String message = age >= 18 ? 'Adult' : 'Minor';
print(message); // Output: Adult
}
উদাহরণ: Type Test Operators
void main() {
var number = 10;
if (number is int) {
print('It is an integer');
}
if (number is! double) {
print('It is not a double');
}
}
Dart এর Variables, Data Types, এবং Operators ব্যবহার করে আপনি প্রোগ্রামে ডেটা সংরক্ষণ, গণনা, এবং শর্ত অনুযায়ী কার্য সম্পাদন করতে পারবেন।
Dart প্রোগ্রামিং ভাষায় Control Structures হলো প্রোগ্রামের বিভিন্ন শর্ত বা পুনরাবৃত্তিমূলক কাজ সম্পাদনের জন্য ব্যবহৃত স্টেটমেন্ট বা গঠন। Dart এ প্রধান Control Structures হলো if-else, switch-case, এবং loops (যেমনঃ for, while, এবং do-while)।
Control Structures (if-else, switch-case, loops)
নিচে এগুলোর বিস্তারিত আলোচনা করা হলো:
১. if-else স্টেটমেন্ট:
if-else স্টেটমেন্ট ব্যবহার করে প্রোগ্রামের মধ্যে শর্তভিত্তিক সিদ্ধান্ত নেয়া হয়। যদি শর্তটি সত্য হয়, তাহলে একটি ব্লক এক্সিকিউট হয়; নতুবা অন্যটি।
void main() {
int number = 10;
if (number > 0) {
print('Number is positive');
} else if (number < 0) {
print('Number is negative');
} else {
print('Number is zero');
}
}
- এখানে প্রথমে চেক করা হচ্ছে, number কি পজিটিভ? যদি সত্য হয়, তাহলে ‘Number is positive’ প্রিন্ট হবে।
- যদি শর্তটি মিথ্যা হয়, তবে পরবর্তী শর্ত চেক করা হবে।
- যদি কোনও শর্তই সত্য না হয়, তবে else ব্লক এক্সিকিউট হবে।
২. switch-case স্টেটমেন্ট:
switch-case স্টেটমেন্ট ব্যবহার করে একটি ভেরিয়েবলের মান অনুযায়ী প্রোগ্রাম কোন ব্লক এক্সিকিউট হবে তা নির্ধারণ করা হয়। এটি সাধারণত if-else স্টেটমেন্টের বিকল্প হিসেবে ব্যবহৃত হয়, যখন অনেকগুলো কন্ডিশন চেক করতে হয়।
void main() {
String day = 'Monday';
switch (day) {
case 'Monday':
print('It\'s the start of the week!');
break;
case 'Friday':
print('Weekend is coming!');
break;
case 'Saturday':
case 'Sunday':
print('It\'s the weekend!');
break;
default:
print('It\'s a regular day.');
}
}
- switch ব্লকে day ভেরিয়েবলটির মান চেক করা হয়।
- যদি মানটি ‘Monday’ হয়, তাহলে ‘It’s the start of the week!’ প্রিন্ট হবে।
- break স্টেটমেন্ট ব্যবহার করা হয় কেস এক্সিকিউট হওয়ার পর switch ব্লক থেকে বের হয়ে আসার জন্য।
- default ব্লক তখনই এক্সিকিউট হবে, যখন কোনো কেসের মান মিলবে না।
৩. Loops:
Loops Dart এ একটি নির্দিষ্ট শর্ত পর্যন্ত কাজের পুনরাবৃত্তি করতে ব্যবহার করা হয়। Dart এ প্রধান লুপগুলো হলো: for loop, while loop, এবং do-while loop।
for লুপ:
for loop সাধারণত একটি নির্দিষ্ট সংখ্যা পর্যন্ত পুনরাবৃত্তি করতে ব্যবহৃত হয়।
void main() {
for (int i = 0; i < 5; i++) {
print('Iteration: $i');
}
}
- এখানে, i ভেরিয়েবল ০ থেকে শুরু হয়ে ৫ এর কম পর্যন্ত পুনরাবৃত্তি করবে। প্রতিবার লুপের ভিতর থেকে print স্টেটমেন্ট এক্সিকিউট হবে।
while লুপ:
while loop একটি নির্দিষ্ট শর্ত পর্যন্ত পুনরাবৃত্তি করতে ব্যবহৃত হয়। শর্তটি সত্য থাকলে লুপ চলবে।
void main() {
int count = 0;
while (count < 5) {
print('Count: $count');
count++;
}
}
- এখানে, count ভেরিয়েবল ৫ এর কম পর্যন্ত লুপ চলবে এবং প্রতিবার count এর মান ১ করে বৃদ্ধি পাবে।
do-while লুপ:
do-while loop এর ক্ষেত্রে প্রথমে লুপের ভিতরের ব্লক এক্সিকিউট হয়, তারপর শর্ত চেক করা হয়। অর্থাৎ, শর্ত মিথ্যা হলেও কমপক্ষে একবার লুপের ব্লক এক্সিকিউট হবে।
void main() {
int count = 0;
do {
print('Count: $count');
count++;
} while (count < 5);
}
- এখানে, count এর মান ৫ এর কম হলে লুপ চলবে, তবে প্রথমবারের মতো do ব্লক এক্সিকিউট হবে।
সংক্ষেপে Control Structures:
| Control Structure | ব্যবহার |
|---|---|
| if-else | শর্তভিত্তিক সিদ্ধান্ত নিতে |
| switch-case | একটি ভেরিয়েবলের মান অনুযায়ী সিদ্ধান্ত নিতে |
| for loop | নির্দিষ্ট সংখ্যা বা পুনরাবৃত্তির জন্য |
| while loop | শর্ত পূরণ না হওয়া পর্যন্ত পুনরাবৃত্তি করতে |
| do-while loop | কমপক্ষে একবার লুপ চালাতে এবং শর্ত চেক করতে |
Dart এ এই Control Structures ব্যবহার করে প্রোগ্রামের বিভিন্ন শর্ত বা পুনরাবৃত্তিমূলক কাজ কার্যকরীভাবে সম্পাদন করা যায়।
Dart-এর ফাংশন এবং এরর হ্যান্ডলিং ব্যবহার করে কোড আরও সংগঠিত, কার্যকর এবং ত্রুটিমুক্ত করা যায়।
Dart-এ ফাংশন এবং এরর হ্যান্ডলিং নিয়ে বিস্তারিতভাবে আলোচনা নিচে দেওয়া হলো:
Functions (ফাংশন)
Dart প্রোগ্রামিং ভাষায় ফাংশন হলো কোডের একটি ব্লক, যা একটি নির্দিষ্ট কাজ সম্পাদন করতে ব্যবহৃত হয়। Dart-এ ফাংশনগুলো ক্লাসের বাইরে বা ভিতরে ডিফাইন করা যেতে পারে। নিচে Dart-এর ফাংশন সম্পর্কিত ধারণা এবং উদাহরণগুলো দেওয়া হলো:
ফাংশন ডিক্লেয়ার করা
Dart এ ফাংশন ডিক্লেয়ার করা হয় return_type এবং function_name ব্যবহার করে:
return_type function_name(parameters) {
// function body
}
উদাহরণ ১: একটি সাধারণ ফাংশন
int add(int a, int b) {
return a + b;
}
void main() {
int sum = add(10, 5);
print(sum); // Output: 15
}
উদাহরণ ২: void ফাংশন
void greet(String name) {
print('Hello, $name!');
}
void main() {
greet('Alice'); // Output: Hello, Alice!
}
Arrow Function (ল্যাম্বডা বা অ্যারো ফাংশন)
Dart এ => অপারেটর ব্যবহার করে একটি সংক্ষিপ্ত ফাংশন লেখা যায়:
int multiply(int a, int b) => a * b;
void main() {
print(multiply(4, 5)); // Output: 20
}
Optional এবং Named Parameters
Optional Parameters: ফাংশনের প্যারামিটারগুলো ব্র্যাকেট [] এর ভিতরে রাখলে তা ঐচ্ছিক হিসেবে বিবেচিত হয়:
void printDetails(String name, [int? age]) {
if (age != null) {
print('$name is $age years old.');
} else {
print('$name\'s age is unknown.');
}
}
void main() {
printDetails('Alice'); // Output: Alice's age is unknown.
printDetails('Bob', 30); // Output: Bob is 30 years old.
}
Named Parameters: Dart-এ required কীওয়ার্ড ব্যবহার করে ফাংশনের প্যারামিটারগুলোকে নির্দিষ্ট করা যায় এবং ডিফল্ট ভ্যালু সেট করা যায়:
void describe({required String name, int age = 18}) {
print('$name is $age years old.');
}
void main() {
describe(name: 'Charlie'); // Output: Charlie is 18 years old.
describe(name: 'David', age: 25); // Output: David is 25 years old.
}
Anonymous Functions (গোপন বা অজানা ফাংশন)
Dart এ ফাংশনগুলোকে ভেরিয়েবলে সংরক্ষণ করা যায় এবং প্যারামিটার ছাড়া সেগুলোকে ডিফাইন করা যায়:
void main() {
var printMessage = (String message) {
print(message);
};
printMessage('Hello, Dart!'); // Output: Hello, Dart!
}
Error Handling (এরর হ্যান্ডলিং)
Dart-এ এরর হ্যান্ডলিংয়ের জন্য try, catch, on, এবং finally ব্লক ব্যবহার করা হয়। এগুলো ব্যবহার করে প্রোগ্রামে কোনো ত্রুটি বা এরর ধরা পড়লে তা পরিচালনা করা যায়।
try-catch ব্লক
try ব্লকের ভেতরে থাকা কোডে কোনো এরর থাকলে catch ব্লকে ধরা পড়বে এবং সেখানে তার সমাধান বা নোটিফিকেশন প্রদর্শন করা যাবে।
void main() {
try {
int result = 10 ~/ 0; // Division by zero error
print(result);
} catch (e) {
print('Error: $e'); // Output: Error: IntegerDivisionByZeroException
}
}
on-catch ব্লক
on কীওয়ার্ড ব্যবহার করে নির্দিষ্ট এরর টাইপের জন্য আলাদা হ্যান্ডলিং করা যায়:
void main() {
try {
int result = 10 ~/ 0;
print(result);
} on IntegerDivisionByZeroException {
print('Cannot divide by zero!');
} catch (e) {
print('Error: $e');
}
}
finally ব্লক
finally ব্লক সবসময় চলবে, চাইলেও সেটা হোক try সফল হলেও বা catch ব্লকে এরর ধরা পড়লেও:
void main() {
try {
int result = 10 ~/ 0;
print(result);
} catch (e) {
print('Error: $e');
} finally {
print('This block always executes.');
}
}
Custom Exceptions (কাস্টম এক্সেপশন)
Dart এ কাস্টম এক্সেপশন তৈরি করা যায়। এজন্য একটি ক্লাস তৈরি করতে হবে যা Exception ক্লাস থেকে ইনহেরিট করবে:
class AgeException implements Exception {
String errorMessage() => 'Age cannot be negative!';
}
void checkAge(int age) {
if (age < 0) {
throw AgeException();
} else {
print('Valid age: $age');
}
}
void main() {
try {
checkAge(-5);
} catch (e) {
print(e.errorMessage()); // Output: Age cannot be negative!
}
}
এরর রিইথ্রো করা
কখনো কখনো আমরা একটি এরর ধরতে চাই এবং তারপর সেটি পুনরায় ছুঁড়তে চাই, এর জন্য rethrow ব্যবহার করা হয়:
void divideNumbers(int a, int b) {
try {
print(a ~/ b);
} catch (e) {
print('Error: $e');
rethrow; // Re-throwing the exception
}
}
void main() {
try {
divideNumbers(10, 0);
} catch (e) {
print('Handled again in main: $e');
}
}
Dart এরর হ্যান্ডলিংয়ের গুরুত্বপূর্ণ দিক
- Dart এ
try-catchব্যবহার করে এরর হ্যান্ডেল করলে কোড ক্র্যাশ থেকে রক্ষা করা যায়। finallyব্লক ব্যবহার করে আপনি শেষমেশ ক্লিনআপ বা রিসোর্স মুক্ত করার কাজ করতে পারেন।- কাস্টম এক্সেপশন ব্যবহার করে আপনি আপনার কোডে আরও স্পেসিফিক এরর হ্যান্ডলিং যোগ করতে পারেন, যা বাগ খুঁজে পেতে সহায়ক।
Read more